package cn.flying.cloud.flow.core.listener.event.callback;

import javax.annotation.Resource;

import org.flowable.common.engine.api.delegate.event.FlowableEvent;
import org.flowable.common.engine.impl.event.FlowableEntityEventImpl;
import org.flowable.engine.TaskService;
import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import cn.flying.cloud.base.common.utils.Ft;
import cn.flying.cloud.flow.core.listener.handler.UserHandler;

/**
 * 任务创建监听
 *
 * @author: admin
 * @date: 2023年02月26日 08:24
 * @version: 1.0
 */
@Component
public class TaskCreatedListenerCallback implements EventListenerCallback {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Resource
    private UserHandler userHandler;
    @Resource
    private TaskService taskService;

    /**
     * 设置任务的代理人，没有配置${assignee}变量的在这里设置
     *
     * @param event
     */
    @Override
    public void execute(FlowableEvent event) {
        logger.info("==========任务创建监听器回调处理---start===========");
        logger.info("监听事件类型：【{}】", event.getType().name());

        FlowableEntityEventImpl entityEvent = (FlowableEntityEventImpl) event;
        TaskEntityImpl entity = (TaskEntityImpl) entityEvent.getEntity();

        // 这里还是再次检查一下任务是否有指定的代理人，避免多次重复设置
        String assignee = entity.getAssignee();
        // 如果使用了变量表达式，则可以通过表达式来设置，没有则在这里设置
        if (assignee != null && assignee.contains("${assignee}")) {
            logger.info("==========任务创建监听器回调处理---end===========");
            return;
        }

        // 获取用户
        String userId = userHandler.getAssignee(entity.getProcessDefinitionId(), entity.getTaskDefinitionKey());
        if (Ft.String.isBlank(userId)) {
            logger.info("==========任务创建监听器回调处理---end===========");
            return;
        }
        taskService.setAssignee(entity.getId(), assignee);
        logger.info("流程实例：【{}】任务：[{}，{}]分配代理人：【{}】", entity.getProcessInstanceId(), entity.getName(), entity.getTaskDefinitionKey(), assignee);
        logger.info("==========任务创建监听器回调处理---end===========");
    }
}